#include "ConexionServer.h"
#include "../../SDLtoolkit/ScenarioElement.h"
#include "../DTOBackground.h"
#include "../DTOCliente.h"
#include "../DTOFinHandshake.h"
#include "../../Server/ColaMensajesHandshake.h"


ConexionServer::ConexionServer(SocketProtocoloPlano* socket,BattleMasterGame* game,int listenPort,int broadcastPort,ColaMensajeRecibir* colaMensajesServer) {
	this->colaMensajesServer = colaMensajesServer;
	this->enviarACliente = new ColaMensajeEnviar(SERVER_OWN);

	this->handshake(socket,game,listenPort,broadcastPort,enviarACliente,colaMensajesServer);
}

std::string ConexionServer::getClienteId(){
	return cliente;
}

void ConexionServer::handshake(SocketProtocoloPlano* socket,BattleMasterGame* game,int listenPort,int broadcastPort,ColaMensajeEnviar* enviar,ColaMensajeRecibir* recibir){
	ColaMensajesHandshake* mensajesHandshake = new ColaMensajesHandshake(SERVER_OWN);
	ConexionBidireccional* conexion = new ConexionBidireccional("localhost",socket,mensajesHandshake);

	//Realizo el handshake con el cliente
	DTOBackground* dtoBcg = new DTOBackground(game->getBackgroundPath(),true);
	conexion->enviar(dtoBcg);

	std::list<ScenarioElement*> elements = game->getElements();

	list<ScenarioElement*>::iterator it;
	for (it = elements.begin(); it != elements.end(); ++it) {
		conexion->enviar(((ScenarioElement*)*it)->getDTO());
	}

	//Cruzo los puertos, la conexion es crusada
	conexion->enviar(new DTOFinHandshake(broadcastPort,listenPort));

	DTOCliente* cliente= (DTOCliente*)conexion->recibir();
	this->cliente = cliente->getOwner();

	//Devuelvo el cliente como ultima instancia del handshake
	conexion->enviar(cliente);

	//Cambio los puertos de mis recever y sender para iniciar la comunicacion

	this->conexionACliente = new ConexionBidireccional(socket,listenPort,broadcastPort,colaMensajesServer,enviarACliente);
}

void ConexionServer::addToSend(DTO* dto){
	this->enviarACliente->setMensajeValidated(dto);
}

bool ConexionServer::isConnected(){
	return conexionACliente->isConnected();
}


void ConexionServer::terminar(){
	conexionACliente->terminar();
	enviarACliente->terminar();
	enviarACliente->signal();
	conexionACliente->join();
}

ConexionServer::~ConexionServer(){
	delete conexionACliente;
	delete enviarACliente;
}

